package day24.homework;

import java.util.*;
import java.io.*;

public class hw5 {
    public static void main(String[] args) {
        // 创建一个TreeMap集合来存储学生信息，指定自定义比较器StudentComparator
        // TreeMap能够根据比较器对学生进行排序，StudentComparator实现按成绩逆序排列
        Map<Student, String> studentMap = new TreeMap<>(new StudentComparator());
        
        // 创建Scanner对象用于从控制台读取用户输入的数据
        Scanner scanner = new Scanner(System.in);
        // 提示用户输入学生信息，并说明输入格式和结束条件
        System.out.println("请输入学生信息（格式：学号.姓名.年龄.分数），输入quit结束：");
        
        // 使用无限循环持续接收用户输入，直到用户输入"quit"才退出循环
        while (true) {
            // 读取用户输入的一行字符串
            String input = scanner.nextLine();
            // 判断用户是否输入了退出命令"quit"
            if ("quit".equals(input)) {
                // 如果是退出命令，则跳出循环，结束输入过程
                break;
            }
            
            // 使用"."作为分隔符将输入的字符串拆分成多个部分
            // 例如："001.张三.20.85.5"会被拆分为["001", "张三", "20", "85.5"]四个部分
            String[] parts = input.split("\\.");
            // 检查拆分后的数组长度是否为4，确保输入格式正确（包含学号、姓名、年龄、分数四个部分）
            if (parts.length == 4) {
                // 提取学号信息，位于数组的第一个位置（索引为0）
                String id = parts[0];
                // 提取姓名信息，位于数组的第二个位置（索引为1）
                String name = parts[1];
                // 提取年龄信息并转换为整数类型，位于数组的第三个位置（索引为2）
                int age = Integer.parseInt(parts[2]);
                // 提取分数信息并转换为双精度浮点数类型，位于数组的第四个位置（索引为3）
                double score = Double.parseDouble(parts[3]);
                
                // 使用提取到的信息创建一个新的Student对象
                Student student = new Student(id, name, age, score);
                
                // 将学生对象作为键，学号作为值存入Map集合中
                // 这样存储的目的是为了后续可以根据Student对象进行排序，同时保留学号信息
                studentMap.put(student, id);
            } else {
                // 如果输入格式不正确（不是四个部分），提示用户重新输入
                System.out.println("输入格式错误，请重新输入！");
            }
        }
        
        // 输出提示信息，表示接下来将按成绩逆序显示学生信息
        System.out.println("\n按成绩逆序排列的学生信息");
        // 使用增强for循环遍历Map集合中的所有键值对
        // entrySet()方法返回Map中所有键值对的Set集合，每个元素都是Map.Entry类型
        for (Map.Entry<Student, String> entry : studentMap.entrySet()) {
            // 获取键值对中的值（学号）和键（Student对象）
            // 输出格式化的学生信息，显示学号和学生详细信息
            System.out.println("学号: " + entry.getValue() + ", 学生信息: " + entry.getKey());
        }
        
        // 输出提示信息，表示接下来将检查并可能删除003号学生
        System.out.println("\n检查并删除003号学生");
        // 定义布尔变量found用于标记是否找到003号学生，初始值为false表示未找到
        boolean found = false;
        // 定义Student类型的变量studentToRemove用于存储需要删除的学生对象
        Student studentToRemove = null;
        // 使用增强for循环遍历Map集合中所有的键（Student对象）
        // keySet()方法返回Map中所有键的Set集合
        for (Student student : studentMap.keySet()) {
            // 判断当前学生对象的学号是否为"003"
            if ("003".equals(student.getId())) {
                // 如果找到003号学生，将该学生对象赋值给studentToRemove变量
                studentToRemove = student;
                // 将found标记设置为true，表示已找到目标学生
                found = true;
                // 使用break语句跳出循环，因为已经找到目标学生，无需继续查找
                break;
            }
        }
        
        // 判断是否找到了003号学生
        if (found) {
            // 如果找到了，则从Map集合中删除该学生对象
            studentMap.remove(studentToRemove);
            // 输出删除成功的提示信息
            System.out.println("003号学生已删除");
        } else {
            // 如果没有找到，则输出未找到的提示信息
            System.out.println("未找到003号学生");
        }
        
        // 输出提示信息，表示接下来将使用另一种方式遍历并显示删除后的学生信息
        System.out.println("\n删除后剩余学生信息（使用entrySet方式遍历）");
        // 获取Map集合entrySet的迭代器，用于遍历所有键值对
        Iterator<Map.Entry<Student, String>> iterator = studentMap.entrySet().iterator();
        // 使用while循环和迭代器遍历Map集合
        // hasNext()方法用于判断是否还有下一个元素
        while (iterator.hasNext()) {
            // 获取下一个键值对元素
            Map.Entry<Student, String> entry = iterator.next();
            // 输出当前学生的信息，包括学号和详细信息
            System.out.println("学号: " + entry.getValue() + ", 学生信息: " + entry.getKey());
        }
    }
}